﻿namespace los4
{
    #region     知识点一   构造函数
    //基本概念
    //在实例化对象时 会调用的用于初始化的函数
    //如果不写 默认存在一个无参构造函数

    //构造函数的写法
    //1.没有返回值
    //2.函数名和类名必须相同
    //3.没有特殊需求时 一般都是public的
    class Person
    {
        public string name;
        public int age;
        //类中是允许自己申明无参构造函数的
        //结构体是不允许的
        public Person()
        {
            name = "秦洛南";
            age = 21;
        }
        //4.构造函数可以被重载
        public Person(string name)
        {
            //5.this代表当前调用该函数的对象自己
            this.name = name;
        }
        public Person(string name, int age) : this(name)//先执行this后的函数 
        //这里有两个注意的点，this后面括号里的参数必须是它前面函数传进去的
        //其中一个参数，且类中必须有该参数的初始化函数
        {
            Console.WriteLine(name);

        }
    }

    //注意：
    //如果不自己实现无参构造函数而实现了有参构造函数
    //会失去默认的无参构造
    #endregion
    #region     知识点二   构造函数特殊写法
    //可以通过this 重用构造函数代码
    //访问修饰符 构造函数名（参数列表）:this(参数1，参数2...)
    #endregion
    #region     知识点三   析构函数
    //基本概念
    //当引用类型的堆内存被回收时，会调用该函数
    //对于需要手动管理内存的语言（比如C++），需要在析构函数中做一些内存回收处理
    //但是C#中存在自动垃圾回收机制GC
    //所以我们几乎不使用析构函数。除非你想在某一个对象被垃圾回收时，做一些特殊处理
    //注意：
    //在Unity开发中析构函数几乎不会使用 该知识点稍作了解即可
    //基本语法
    //~类名
    //{
    //}
    #endregion
    #region     知识点四   垃圾回收机制
    //垃圾回收，英文简写GC（Garbage Collector）
    //垃圾回收的过程是在遍历堆（Heap）上动态分配的所有对象
    //通过识别它们是否被引用来确定哪些对象是垃圾，哪些对象仍要使用
    //所谓的垃圾就是没有被任何变量，对象引用的内容
    //垃圾就要被回收释放

    //垃圾回收有很多种算法
    //比如
    //引用计数（Reference Counting）
    //标记清除（Mark Sweep）
    //标记整理（Mark Compact）
    //复制集合（Copy Collection）

    //注意
    //GC只负责堆内存的垃圾回收
    //引用类型都是存在堆中的，所以它的分配和释放都要通过垃圾回收机制来管理
    #endregion


    internal class class4
    {
        static void Main(string[] args)
        {
            Console.WriteLine("构造函数和析构函数");
            Person p = new Person();
            Console.WriteLine(p.name);

            //手动触发垃圾回收
            //一般情况下 我们不会频繁调用
            //都是在 Loading过场景时才调用
            GC.Collect();
        }
    }
}
